<?php
/**
 * 目录处理类
 * @author chengtao<chengtao05011633@gmail.com>
 * @version 0.0.1 
 * @todo 是否是和File类合并 暂时只兼容linux
 */
class CtDir{
	/**
	 * 以队列的方式广度优先遍历获取文件列表(不包括文件夹)
	 * @save_path 文件的路径
	 * @depth     遍历的深度
	 */
	static public function getFileList($save_path,$max_depth = 100000){
		$file_list = array();
		$dir_list[] = $save_path;
		$root_depth = count(array_filter(explode(DIRECTORY_SEPARATOR,$save_path)));
		while( $dir_path = array_shift($dir_list)){
			$dh=@opendir($dir_path);
			while(($file = @readdir($dh)) !== false){
				if($file != '.' && $file != '..'){
					$tmp_file = $dir_path.DIRECTORY_SEPARATOR.$file;
					if(is_dir($tmp_file)){
						if(count(array_filter(explode(DIRECTORY_SEPARATOR,$tmp_file)))-$root_depth <= $max_depth){
							$dir_list[] = $tmp_file;
						}
					}elseif(is_file($tmp_file)){
						$file_list[] = $tmp_file;
					}
				}
			}
		}
		return $file_list;
	}
	/**
	 * 获取当前路径的子目录列表
	 */
	static public function getDirList($save_path,$max_depth = 100000,$limit = -1){
		$dir_list[] = $save_path;
		$result = array();
		$i = 0;
		while( $dir_path = array_shift($dir_list)){
			$dh=@opendir($dir_path);
			while(($file = @readdir($dh)) !== false){
				if($file != '.' && $file != '..'){
					$tmp_file = $dir_path.DIRECTORY_SEPARATOR.$file;
					if(is_dir($tmp_file)){
						if(count(array_filter(explode(DIRECTORY_SEPARATOR,$tmp_file)))-$root_depth <= $max_depth){
							$result[] = $dir_list[] = $tmp_file;	
						}
					}
				}
			}
		}
		return $result;
	}
	/**
	 * 把树状的文件移动到根目录
	 * @param $save_path 待处理的路径
	 */
	static public function moveFileToRoot($save_path){
		$file_list = self::getFileList($save_path);
		foreach($file_list as $file){
			$in_file = $file;
			$out_file = $save_path.'/'.end(explode('/',$file));
			if($in_file != $out_file){
				if(file_exists($out_file)){//如果文件已经存在则添加前缀
					$out_file = $save_path.DIRECTORY_SEPARATOR.uniqid().'_prefix_'.end(explode('/',$file));
				}
				rename($in_file,$out_file);
			}
		}
	}
	/**
	 * 删除执行某个目录下的所有空的文件夹
	 * @param $save_path
	 */
	static public function removeNullDir($save_path){
		$dir_list[] = $save_path;
		$dir_list_rm = array();
		while( $dir_path = array_shift($dir_list)){
			$dh=@opendir($dir_path);
			while(($file = @readdir($dh)) !== false){
				if($file != '.' && $file != '..'){
					if(is_dir($dir_path.'/'.$file)){
						$dir_list[] = $dir_list_rm[] = $dir_path.'/'.$file;
					}
				}
			}
		}
		/**
		 * 深度优先遍历，倒排删除即可
		 */
		rsort($dir_list_rm);
		foreach($dir_list_rm as $dir ){
			if(self::dirIsNull($dir)){
				rmdir($dir);
			}
		}
	}
	/**
	 * 判断目录是否为空
	 */
	static public function dirIsNull($directory){  
		$handle = opendir($directory);  
		while (($file = readdir($handle)) !== false)  {  
			if ($file != "." && $file != "..") {  
				closedir($handle);  
				return false;  
			}  
		}  
		closedir($handle);  
		return true;  
	}  
	/**
	 * 判断当前目录是否有子目录
	 */
	static public function hasChildDir($directory){
		
		return count(self::getDirList($directory)) >0;
	}
}

